package com.haiyi.activiti.engine.framework.activiti.manager;

import com.haiyi.activiti.engine.model.entity.FormModel;
import com.haiyi.activiti.engine.model.entity.ComponentDesign;
import com.haiyi.activiti.engine.model.entity.Process;
import com.haiyi.activiti.engine.query.FormModelQuery;
import com.haiyi.activiti.engine.query.ComponentDesignQuery;

import java.util.Map;

/**
 * <p> </p>
 *
 * <pre> Created: 2018/12/5 17:21 </pre>
 *
 * @author hlu
 * @version 1.0
 * @since JDK 1.7
 */
public interface FormManager {

    /**
     * 开始表单
     */
    String START_FORM = "0";

    /**
     * 任务表单
     */
    String TASK_FORM="1";

    /**
     * 创建一个表单源查询条件
     * @return
     */
    ComponentDesignQuery createFormResourceQuery();

    /**
     * 创建一个表单模型查询条件
     * @return
     */
    FormModelQuery createFormModelQuery();

    /**
     * 任务表单提交，这里会： 1、规则引擎校验参数合法性  2、数据入库  3、提交任务节点到下一个节点
     * @param taskId
     * @param formId
     */
    void submitTaskForm(String taskId, String formId, Map<String,Object> submitParams);

    /**
     * 开始表单提交，这里会： 1、规则引擎校验参数合法性   2、数据入库
     * 注：此方法内部使用，不建议使用。
     * @param formModel
     * @param submitParams
     */
    void submitStartForm(FormModel formModel, Map<String,Object> submitParams);

    /**
     * 创建一个表单源
     * @param formResource
     */
    void createFormResource(ComponentDesign formResource);

    /**
     * 创建一个表单模型
     * @param formModel
     */
    void createFormModel(FormModel formModel);

    /**
     * 修改一个表单源
     * @param formResource
     */
    void updateFormResource(ComponentDesign formResource);

    /**
     * 修改一个表单模型
     * @param formModel
     */
    void updateFormModel(FormModel formModel);

    /**
     * 删除一个已有的表单源
     * @param iid
     */
    void deleteFormResource(String iid);

    /**
     * 删除一个已有表单模型
     * @param iid
     */
    void deleteFormModel(String iid);

    /**
     * 根据流程获取当前的表单模型
     * @param processInstanceId
     * @return
     */
    FormModel getProcessCurrentFormModelById(String processInstanceId);

    /**
     * 根据流程Key获取当前的表单模型
     * @param processInstanceKey
     * @return
     */
    FormModel getProcessCurrentFormModelByKey(String processInstanceKey);

    /**
     * 创建一个开始表单模型
     * @param processId 流程id
     * @param formModel 表单模型，这个模型可以是存在的，也可以是不存在的，不存在的话会自动创建
     */
    void createStartFormModel(String processId,FormModel formModel);

    /**
     * 创建一个开始表单模型
     * @param process   流程
     * @param formModel 表单模型，这个模型可以是存在的，也可以是不存在的，不存在的话会自动创建
     */
    void createStartFormModel(Process process, FormModel formModel);
}
